#include <sw/redis++/redis.h>
#include <iostream>
#include <string>
#include <thread>
#include <gflags/gflags.h>

DEFINE_bool(redis_keep_alive, true, "是否保持长连接");
DEFINE_int32(redis_db, 0, "redis 库号");
DEFINE_int32(redis_port, 6379, "redis 服务器端口");
DEFINE_string(redis_host, "111.230.94.31", "redis 服务器 IP 地址");

void add_string(sw::redis::Redis &client) {
    client.set("会话1", "用户 ID1");
    client.set("会话2", "用户 ID2");
    client.set("会话3", "用户 ID3");
    client.set("会话4", "用户 ID4");
    client.set("会话5", "用户 ID5");

    client.set("会话5", "用户 ID555");

    client.del("会话3");

    auto user1 = client.get("会话1");
    if (user1) std::cout << user1.value() << std::endl;
    auto user2 = client.get("会话2");
    if (user2) std::cout << user2.value() << std::endl;
    auto user3 = client.get("会话3");
    if (user3) std::cout << user3.value() << std::endl;
    auto user4 = client.get("会话4");
    if (user4) std::cout << user4.value() << std::endl;
    auto user5 = client.get("会话5");
    if (user5) std::cout << user5.value() << std::endl;
}

void expired_test(sw::redis::Redis &client) {
    client.set("会话1", "用户ID11111", std::chrono::milliseconds(1000));
}

void list_test(sw::redis::Redis &client) {
    client.rpush("群聊1", "成员1");
    client.rpush("群聊1", "成员2");
    client.rpush("群聊1", "成员3");
    client.rpush("群聊1", "成员4");
    client.rpush("群聊1", "成员5");

    std::vector<std::string> users;
    client.lrange("群聊1", 0, -1, std::back_inserter(users));

    for (auto &user : users) {
        std::cout << user << std::endl;
    }
}

int main(int argc, char *grgv[])
{
    // 1. 实例化 Redis对象，构造连接选项，连接服务器
    sw::redis::ConnectionOptions opts;
    opts.host = FLAGS_redis_host;
    opts.port = FLAGS_redis_port;
    opts.db = FLAGS_redis_db;
    opts.keep_alive = FLAGS_redis_keep_alive;
    sw::redis::Redis client(opts);
    // 2. 添加字符串键值对，删除字符串键值对，获取字符串键值对
    add_string(client);
    // 3. 实践控制数据有效时间的操作
    expired_test(client);
    // 4. 列表的操作,主要实现数据的右插，左获取
    std::cout << "-------------------------------------\n";
    list_test(client);

    return 0;
}